package com.ecloud.hbase.service;

import com.ecloud.hbase.standard.GetInner;
import com.ecloud.hbase.standard.HbaseTable;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.Result;

/**
 * @author Squbi
 */
public interface HbaseService {
    /**
     * 表是否存在
     *
     * @param tableName 表名
     * @return bool
     * @author Squbi
     * @date 2021/6/16 15:48
     */
    boolean isTableExist(String tableName);

    /**
     * 表是否存在
     *
     * @param tableName 表名
     * @return bool
     * @author Squbi
     * @date 2021/6/16 15:48
     */
    boolean isTableExist(TableName tableName);

    /**
     * 表是否存在
     *
     * @param tableClass 表类
     * @return bool
     * @author Squbi
     * @date 2021/6/16 15:48
     */
    <T extends HbaseTable> boolean isTableExist(Class<T> tableClass);

    /**
     * 创建表
     * 根据tableClass创造表
     * tableName为ClassName
     * 列族为Class的属性
     *
     * @param tableClass table的实体类
     * @author Squbi
     * @date 2021/6/16 15:47
     */
    <T extends HbaseTable> void createTable(Class<T> tableClass);

    /**
     * 设置数据到表
     *
     * @param table  表类的实体
     * @param rowKey 行键
     * @author Squbi
     * @date 2021/7/19 14:45
     */
    <T extends HbaseTable> void setData(T table, String rowKey);

    /**
     * 获取数据 整合方法
     *
     * @param rowKey     行键
     * @param tableClass 表类
     * @return <T extends HbaseTable> T {@link HbaseTable}
     * @author Squbi
     * @date 2021/7/19 14:46
     */
    <T extends HbaseTable> T getData(Class<T> tableClass, String rowKey);

    /**
     * 获取原生Result
     *
     * @param inner      {@link GetInner}
     * @param rowKey     行键
     * @param tableClass 表类
     * @return <T extends HbaseTable> T {@link HbaseTable}
     * @author Squbi
     * @date 2021/7/19 14:46
     */
    <T extends HbaseTable> Result getResult(Class<T> tableClass, String rowKey, GetInner inner);

    /**
     * 获取数据
     *
     * @param get        {@link Get}
     * @param tableClass 表类
     * @return <T extends HbaseTable> T {@link HbaseTable}
     * @author Squbi
     * @date 2021/7/19 14:46
     */
    <T extends HbaseTable> T getData(Class<T> tableClass, Get get);

    /**
     * 获取数据
     *
     * @param rowKey     行键
     * @param tableClass 表类
     * @param inner      {@link GetInner}
     * @return <T extends HbaseTable> T {@link HbaseTable}
     * @author Squbi
     * @date 2021/7/19 14:46
     */
    <T extends HbaseTable> T getData(Class<T> tableClass, String rowKey, GetInner inner);

    /**
     * 解析result到table
     *
     * @param tableClass class
     * @param result     result
     * @return HbaseTable
     * @author Squbi
     * @date 2021/7/27 11:03
     */
    <T extends HbaseTable> T parseResult(Result result, Class<T> tableClass);

    /**
     * 删除表
     *
     * @param tableNameStr 表名
     * @author Squbi
     * @date 2021/7/22 15:13
     */
    void deleteTable(String tableNameStr);
}
